package utils;

import generated.*;
import java.util.Objects;
import server.Card;
import server.Position;

public class BoardTypeAnalyser {

    public static PositionType findPlayer(Integer PlayerID, BoardType board) {
        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < 7; j++) {
                CardType.Pin pinsOnCard = board.getRow().get(i).getCol().get(j).getPin();
                for (Integer pin : pinsOnCard.getPlayerID()) {
                    if (Objects.equals(pin, PlayerID)) {
                        PositionType pos = new PositionType();
                        pos.setCol(j);
                        pos.setRow(i);
                        return pos;
                    }
                }
            }
        }
        // Pin nicht gefunden
        return null;
    }

    public static CardType getCard(int row, int col, BoardType board) {
        CardType card = board.getRow().get(row).getCol().get(col);
        return card;
    }

    public static BoardType getNextTurn(MoveMessageType move, BoardType board) {
        Position sm = new Position(move.getShiftPosition());
        if (sm.getCol() % 6 == 0) { // Col=6 oder 0
            if (sm.getRow() % 2 == 1) {
                // horizontal schieben
                int row = sm.getRow();
                int start = (sm.getCol() + 6) % 12; // Karte die rausgenommen
                // wird
                board.setShiftCard(BoardTypeAnalyser.getCard(row, start, board));

                if (start == 6) {
                    for (int i = 6; i > 0; --i) {
                        board.getRow().get(row).getCol().set(i, new Card(board.getRow().get(row).getCol().get(i)));
                    }
                } else {// Start==0
                    for (int i = 0; i < 6; ++i) {
                        board.getRow().get(row).getCol().set(i, new Card(board.getRow().get(row).getCol().get(i + 1)));
                    }
                }
            }
        } else if (sm.getRow() % 6 == 0) {
            if (sm.getCol() % 2 == 1) {
                // vertikal schieben
                int col = sm.getCol();
                int start = (sm.getRow() + 6) % 12; // Karte die rausgenommen
                // wird
                board.setShiftCard(getCard(start, col, board));
                if (start == 6) {
                    for (int i = 6; i > 0; --i) {
                        board.getRow().get(i).getCol().set(col, new Card(board.getRow().get(i - 1).getCol().get(col)));
                    }
                } else {// Start==0
                    for (int i = 0; i < 6; ++i) {
                        board.getRow().get(i).getCol().set(col, new Card(board.getRow().get(i + 1).getCol().get(col)));
                    }
                }

            }
        }
        PositionType forbidden = board.getForbidden();
        Card c = null;
        c = new Card(move.getShiftCard());
        // Wenn Spielfigur auf neuer shiftcard steht,
        // muss dieser wieder aufs Brett gesetzt werden
        // Dazu wird Sie auf die gerade hereingeschoben
        // Karte gesetzt
        CardType shiftCard = board.getShiftCard();
        if (!shiftCard.getPin().getPlayerID().isEmpty()) {
            // Figur zwischenspeichern
            CardType.Pin temp = shiftCard.getPin();
            // Figur auf SchiebeKarte löschen
            shiftCard.setPin(new CardType.Pin());
            // Zwischengespeicherte Figut auf
            // neuer Karte plazieren
            c.setPin(temp);
        }
        board.getRow().get(sm.getRow()).getCol().set(sm.getCol(), c);
        return board;
    }

    public static PositionType getTreasurePosition(TreasureType treasure, BoardType board) {
        PositionType position = new PositionType();
        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < 7; j++) {
                TreasureType tempTreasure = board.getRow().get(i).getCol().get(j).getTreasure();
                if (null != tempTreasure && tempTreasure.equals(treasure)) {
                    position.setRow(i);
                    position.setCol(j);
                    return position;
                }
            }
        }
        position.setRow(0);
        position.setCol(0);
        return position;
    }
}
